home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2004 #6
/
Amiga Plus CD - 2004 - No. 06.iso
/
AmiSoft
/
Util
/
libs
/
ExtraLib.lha
/
Extra
/
include
/
rhosigma
/
extra.bc
< prev
next >
Wrap
Text File
|
2004-05-30
|
20KB
|
443 lines
' ___________________________________________________________________________
' |*************************************************************************|
' |*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|*|
' |*| Set TAB to 4 for best readable file layout. |*| Maxon Basic 3.00 |*|
' |*|______________________________________________|*|____________________|*|
' |*************************************************************************|
' |*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|*|
' |*| |*| $Id: extra.bc (30.05.04) |*|
' |*| ###### ###### |*| RhoSigma Source based on NDK 3.1 Includes 40.15 |*|
' |*| ## ## ## # |*| _________________________________________________ |*|
' |*| ## ## ## |*| |*|
' |*| ###### ## |*| The public BASIC definitions for extra.library |*|
' |*| ## ## |*| |*|
' |*| ## ## # |*| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |*|
' |*| ## ###### |*| Copyright © 1998-2004 RhoSigma, Roland Heyder |*|
' |*| |*| All Rights Reserved. |*|
' |*|_______________|*|___________________________________________________|*|
' |*************************************************************************|
' ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
'$UNDERLINES
'---------- die BufInfoBlock-Struktur von »BufInfo()« -----------------------
CONST bib_OwnerID% = 0 '(APTR) Task (TCB), der diesen Puffer öffnete
CONST bib_MaxSize% = 4 '(ULONG) momentane Größe des Datenbereichs in Byte
CONST bib_FreeSize% = 8 '(ULONG) davon momentan noch unbenutzt
CONST bib_DataStart% = 12 '(APTR) Adresse des gegenwärtigen Datenbereichs
CONST bib_CurPos% = 16 '(ULONG) aktuelle Cursorposition (Zählbeginn=0 !!)
CONST bib_EndPos% = 20 '(ULONG) aktuelle Anfügeposition
CONST bib_LastFind% = 24 '(APTR) Zeiger auf zuletzt gesuchte Daten od. 0-PTR
CONST bib_FindSize% = 28 '(ULONG) die Länge obiger Such-Daten oder null
CONST bib_KeyNum% = 32 '(ULONG) der Schlüssel der o.g. Such-Daten oder -1
'------------------------------------- neu ab v2.062
CONST bib_DataMemType% = 36 '(ULONG) Speicherflags (MEMF_...) des Datenbereichs
'---------------------------------------------------
CONST bib_SizeOf% = 40
'---------- Modes für »SeekBuf()« -------------------------------------------
CONST SKM_Current% = 0 'Positionierung relativ zur gegenwärtigen CurPos
CONST SKM_Start% = 1 'Positionierung relativ zum Pufferanfang
CONST SKM_End% = 2 'Positionierung relativ zum Pufferende
CONST SKM_Bookmark% = 3 '»Position« = Nummer der gewünschten Bookmark
'---------- die Parameter-Struktur für »UnpackByteRun1()« -------------------
CONST up_InBuf% = 0 '(APTR) Zeiger auf die gepackten Daten
CONST up_InLen% = 4 '(ULONG) die Größe des gepackten Bereichs in Byte
CONST up_Private% = 8 '(ULONG) beim ersten Aufruf unbedingt auf 0 setzen
CONST up_SizeOf% = 12
'---------- Styles, Masken u. Flags für »SpecTextPrefs()« -------------------
'** Styles **
CONST STS_Plain% = 0 'normaler Text \
CONST STS_Underline% = 1 'unterstrichener Text | können durch Addition oder
CONST STS_Bold% = 2 'fettgedruckter Text | log. ODER kombiniert werden
CONST STS_Italic% = 4 'kursiver Text /
'** Masken **
CONST STM_Normal% = &H0 'keine Umrandung, d.h. normale Textausgabe
CONST STM_Outline% = &Hff 'volle Umrandung
CONST STM_Shadow% = &H1c 'Schatten unten/rechts sichtbar
CONST STM_Ghost% = &Hc1 'dies wirkt am besten, wenn Sie als »MPen«
'die selbe Farbe verwenden, wie der Hinter-
'grund hat
'** Flags **
CONST STF_FJAM2& = 1 'Normalerweise benutzt »SpecText()« den DrawMode JAM1,
'mit diesem Flag wird jedoch JAM2 erzwungen.
CONST STF_AP2MP& = 2 'immer der gerade eingestellte »APen« des RastPorts
'soll als »MainPen« (MPen) verwendet werden
CONST STF_BP2TL& = 4 'immer der gerade eingestellte »BPen« des RastPorts
'soll als »TopLeftPen« (TLPen) verwendet werden
CONST STF_OP2BR& = 8 'immer der gerade eingestellte »OPen« des RastPorts
'soll als »BottomRightPen« (BRPen) verwendet werden
CONST STF_PSWAP& = 16 'vertauscht »TLPen« u. »BRPen«, d.h. »TLPen« wird für
'un./re. und »BRPen« für ob./li. verwendet
' Die folgenden Flags haben keinen Einfluß auf die Arbeitsweise der Funk-
' tion »SpecText()«. Sie dienen nur dazu, »SpecTextPrefs()« mitzuteilen,
' welche Parameter neu eingestellt werden sollen. Damit soll überflüssiges
' Register-retten verhindert werden, da Sie nicht jedem Register, welches
' von »SpecTextPrefs()« erwartet wird, zwangsläufig einen sinnvollen Wert
' zuweisen müssen. Wenn Sie z.B. mit D0-D5 irgendwelche Berechnungen machen,
' oder sie als Schleifenzähler benutzen, und wollen dann den »MPen« ver-
' ändern, dann brauchen Sie nur D0 mit diesem zu initialisieren und D5 das
' entsprechende Flag (STF_CMPEN) zuweisen, während Sie sich um D1-D4 nicht
' sorgen müssen, da diese bei jenem Aufruf vollkommen unberührt und unver-
' ändert bleiben, d.h. sie müssen weder gerettet noch initialisiert werden.
'
' ACHTUNG: Wenn keines der folgenden Flags angegeben wird, dann heißt das
' ¯¯¯¯¯¯¯¯ nicht, daß KEIN Wert geändert werden soll, sondern daß ALLE Werte
' zu ändern sind !! (In diesem Falle müssen dann logischer Weise
' auch alle Register initialisiert werden.)
CONST STF_CMPEN& = 1024 'Nur den »MPen« auf den angegebenen Wert ändern.
CONST STF_TLPEN& = 2048 'Nur den »TLPen« auf den angegebenen Wert ändern.
CONST STF_BRPEN& = 4096 'Nur den »BRPen« auf den angegebenen Wert ändern.
CONST STF_STYLE& = 8192 'Nur den SoftStyle auf den angegebenen Wert ändern.
CONST STF_CMASK& = 16384 'Nur die Maske auf den angegebenen Wert ändern.
CONST STF_FLAGS& = 32768 'Nur die Flags auf den angegebenen Wert ändern.
' Es können auch alle Kombinationen der obigen Flags angegeben werden. Die
' Funktion »SpecTextPrefs()« wird dann alles das, was Sie wünschen, ändern.
'---------- Fehlernummern von »LastError()« ---------------------------------
CONST NoError% = 0 'bis jetzt ist kein Fehler aufgetreten
'** DBS-Funktionen **
CONST BufInvalid% = 10 'die angegebene Adresse war kein BufHandle
CONST NotOwner% = 11 'nur der Task, der den Puffer öffnete, darf ihn auch wieder schließen
CONST NoBufMemory% = 12 'nicht mehr genügend Speicher frei (MEMF_... s.a. bib_DataMemType%)
CONST NoDOSProcess% = 13 'die aufrufende Anwendung war kein DOS-Prozess
CONST IoErrRequired%= 14 'ein DOS-Error ist aufgetreten (»IoErr()« der dos.library aufrufen)
CONST SeekBadMode% = 15 'der angegebene »SeekMode« ist unbekannt
CONST SeekOffsetErr%= 16 'gewünschte »Position« unter-/überschreitet den Pufferanfang bzw. das Pufferende
CONST NoFindMem% = 17 'kein Speicher für Zwischenspeicherung der zu suchenden Daten (MEMF_PUBLIC)
CONST FindTooLong% = 18 'von CurPos bis EndPos bzw. Pufferanfang sind nur noch weniger Daten, als gesucht werden sollen
CONST NoFindAvail% = 19 'für »FindNext()/FindPrev()« ist mindestens ein »FindData()« erforderlich (gilt für jeden möglichen Schlüssel)
CONST InvalidKey% = 20 'ein angegebener Schlüssel liegt außerhalb des gültigen Bereichs (bei Find-Funktionen max. 8 (0-7) / bei Bookmarks max. 16 (0-15))
CONST MarkNotSet% = 21 'die angegebene Bookmark ist noch nicht gesetzt
CONST MarkCleared% = 22 'die Daten an der angegebenen Bookmark wurden durch »Clear()« gelöscht
'** StringToLong() **
CONST ResultValid% = 30 'alles in Ordnung (das Ergebnis ist gültig)
CONST InvalidChar% = 31 'im String wurde ein illegales Zeichen gefunden
CONST Overflow% = 32 'repräsentierte Zahl wäre größer als 32 Bit (LONG)
'** FillMem() **
CONST OddAddress% = 35 'ungerade Startadresse bei WORD- oder LONG-Modus
CONST NotFilled% = 36 'keine Füllung wegen Abrundung (Bereich zu klein, um wenigstens 1 Wert aufzunehmen)
'** ShowMsg() **
CONST BadHeight% = 40 'angegebene Höhe war größer als 200 Videozeilen
CONST NoStructMem% = 41 'kein Speicher für benötigte Gfx-Strukturen (MEMF_ANY)
CONST NoChipMemory% = 42 'nicht genügend Speicher für die BitPlanes (MEMF_CHIP)
CONST SpecTextErr% = 43 'die Funktion »SpecText()« hat einen Fehler gemeldet
'---------- die Basis-Struktur der extra.library ----------------------------
CONST xb_Copyright% = 34 '(APTR) ein einzeiliger Copyrightvermerk(+0)
CONST xb_Private% = 38 'ab hier 54 Bytes privater Datenbereich der Library
CONST xb_SizeOf% = 92
'---------- von der extra.library erzeugte Alert's --------------------------
CONST EL_AlertD& = &HB5000000
CONST EL_AlertR& = &H35000000
'Typen-Kennungen der extra.library ($B5000000=DeadEnd/$35000000=Recovery)
CONST EL_NoDfo& = &HB503800B
'konnte diskfont.library V33+ (bzw. V36+ für CGX-Version) nicht öffnen
CONST EL_NoDOS& = &HB5038007
'konnte dos.library V33+ (bzw. V36+ für CGX-Version) nicht öffnen
CONST EL_NoGfx& = &HB5038002
'konnte graphics.library V33+ (bzw. V36+ für CGX-Version) nicht öffnen
CONST EL_NoInt& = &HB5038004
'konnte intuition.library V33+ (bzw. V36+ für CGX-Version) nicht öffnen
CONST EL_NoMath& = &HB5038005
'konnte mathtrans.library V33+ oder
'konnte mathieeesingbas.library V33+ oder
'konnte mathieeedoubbas.library V33+ nicht öffnen ($B5038005)
CONST EL_Trespassed& = &HB5068035
'Task hat Library benutzt, ohne sie vorher zu öffnen
'---------- mit extra.library verwendbare SUB-Routinen ----------------------
CONST SMTPOS_C% = -1 'Text zentrieren
CONST SMTPOS_L% = -2 'Text linksbündig
CONST SMTPOS_R% = -3 'Text rechtsbündig
'*** extra.library / SMCOLOR() ***
'============================================================================
' Diese Routine erstellt einen Farbeintrag für die optional anzugebende Farb-
' tabelle für die Funktion »ShowMsg()«.
'----------------------------------------------------------------------------
' Definiert: extra.bc (Copyright © 1998-2004 RhoSigma, Roland Heyder)
'
' Schablone: Pen%/A/N, Red%/A/N, Green%/A/N, Blue%/A/N, EndFlag%/K/S
'
' Parameter: Pen% --> Nr. des zu ändernden Farbstiftes (3-15)
' (0-2 sind reserviert u. werden ignoriert)
'
' Red% --> Rot-Anteil der neuen Farbe (0-15)
' Green% --> Grün-Anteil der neuen Farbe (0-15)
' Blue% --> Blau-Anteil der neuen Farbe (0-15)
'
' EndFlag% --> - TRUE& , dann endet hier die Farbtabelle
' - FALSE&, dann MUSS noch ein weiterer Farbeintrag
' (SUB-Aufruf) folgen.
'
' Bemerkung: Nach Aufruf der Routine für alle einzelnen Farbeinträge finden
' Sie die fertige Farbtabelle in der Variable »smFarb$«, welche
' Sie an »ShowMsg()« mittels »SADD(smFarb$)« übergeben müssen.
'
' Ein Beispiel für die Benutzung dieser Routine finden Sie in der
' Datei »demo/ShowMsgDemo.BAS«.
'
' ACHTUNG: Sie dürfen in Ihrem Programm keine eigene Stringvariable mit
' ¯¯¯¯¯¯¯¯ dem Namen »smFarb$« verwenden, da diese unweigerlich durch
' dieses Unterprogramm überschrieben werden würde.
'
' Außerdem müssen Sie die Farbtabelle immer unmittelbar vor
' dem »ShowMsg()«-Aufruf definieren, da die Variable »smFarb$«
' jedesmal wieder überschrieben wird, und daher immer nur die
' zuletzt erstellte Farbtabelle enthält.
'
' Siehe auch: »SMTEXTP()«, »SMTEXT()«, »ShowMsg()«
'============================================================================
SUB SMCOLOR(Pen%,Red%,Green%,Blue%,EndFlag%) STATIC
SHARED smFarb$
STATIC lFlag%
IF lFlag%<>0 THEN ' wird eine neue Farbtabelle angefangen,
lFlag%=0 ' dann »smFarb$« erst zurücksetzen
smFarb$=""
ELSE
lFlag%=EndFlag%
END IF
smFarb$=smFarb$+CHR$(Pen%)+MKI$(Red%*256+Green%*16+Blue%)
IF EndFlag%=0 THEN ' wenn kein END-Flag, dann Continue-Byte
smFarb$=smFarb$+CHR$(1) ' setzen, ansonsten 0-Byte
ELSE
smFarb$=smFarb$+CHR$(0)
END IF
END SUB
'*** extra.library / SMTEXTP() ***
'============================================================================
' Diese Routine erstellt einen Teilstring des Parameterstrings der Funktion
' »ShowMsg()« inclusive der gewünschten Einstellungen für die Textausgabe.
' Wahlweise kann der Text automatisch zentriert, oder links- bzw. rechtsbündig
' ausgerichtet werden.
'----------------------------------------------------------------------------
' Definiert: extra.bc (Copyright © 1998-2004 RhoSigma, Roland Heyder)
'
' Schablone: xPos%/A/N, yPos%/A/N, MPen%/A/N, TLPen%/A/N, BRPen%/A/N,
' Style%/A/N, Mask%/A/N, Text$/A, EndFlag%/K/S
'
' Parameter: xPos% --> x-Position des Textes,
' oder einer der oben definierten SMTPOS-Werte
'
' yPos% --> y-Position des Textes,
' Ausrichtung an der Oberkante des Fonts
'
' MPen% --> gewünschter MainPen \
' TLPen% --> gewünschter TopLeftPen |
' BRPen% --> gewünschter BottomRightPen | (s. »SpecTextPrefs()«)
' Style% --> gewünschter SoftStyle |
' Mask% --> gewünschte Randmaske /
'
' Text$ --> der Text selbst als Variable oder Konstante
'
' EndFlag% --> - TRUE& , dann endet hier der Parameterstring
' - FALSE&, dann MUSS noch ein weiterer Teilstring
' (SUB-Aufruf) folgen.
'
' Bemerkung: Nach Aufruf der Routine für alle einzelnen Teilstrings finden
' Sie den fertigen Parameterstring in der Variable »smAlert$«,
' welche Sie an »ShowMsg()« mittels »SADD(smAlert$)« übergeben
' müssen.
'
' Diese Routine sollten Sie nur dann verwenden, wenn Sie für
' diesen Teilstring neue Einstellungen für Farben etc. machen
' wollen. Wenn dieser Teilstring jedoch mit den gleichen Ein-
' stellungen ausgegeben werden soll, wie der vorhergehende bzw.
' Sie die Default-Einstellungen verwenden wollen, dann müssen
' Sie stattdessen die Routine »SMTEXT()« verwenden.
'
' Ein Beispiel für die Benutzung dieser Routine finden Sie in
' der Datei »demo/ShowMsgDemo.BAS«.
'
' ACHTUNG: Sie dürfen in Ihrem Programm keine eigene Stringvariable mit
' ¯¯¯¯¯¯¯¯ dem Namen »smAlert$« verwenden, da diese unweigerlich durch
' dieses Unterprogramm überschrieben werden würde. Außerdem
' dürfen Sie auch nicht »smlFlag%« benutzen, da über dieses
' wichtige Daten zwischen den beiden Routinen »SMTEXTP()« und
' »SMTEXT()« ausgetauscht werden !!
'
' Außerdem müssen Sie den Parameterstring immer unmittelbar vor
' dem »ShowMsg()«-Aufruf definieren, da die Variable »smAlert$«
' jedesmal wieder überschrieben wird, und daher immer nur den
' zuletzt erstellten Parameterstring enthält.
'
' Siehe auch: »SMCOLOR()«, »SMTEXT()«, »ShowMsg()«
'============================================================================
SUB SMTEXTP(xPos%,yPos%,MPen%,TLPen%,BRPen%,Style%,Mask%,Text$,EndFlag%) STATIC
SHARED smAlert$,smlFlag%
IF smlFlag%<>0 THEN ' wird ein neuer ParamString angefangen,
smlFlag%=0 ' dann »smAlert$« erst zurücksetzen
smAlert$=""
ELSE
smlFlag%=EndFlag%
END IF
IF xPos%=SMTPOS_C% THEN ' gewünschte Ausrichtung,
xPos%=(640-(LEN(Text$)*8))/2 ' falls angegeben
ELSEIF xPos%=SMTPOS_L% THEN
xPos%=12
ELSEIF xPos%=SMTPOS_R% THEN
xPos%=(640-(LEN(Text$)*8))-12
END IF
smAlert$=smAlert$+MKI$(xPos%)+CHR$(yPos%)+CHR$(1)+CHR$(MPen%)+CHR$(TLPen%)
smAlert$=smAlert$+CHR$(BRPen%)+CHR$(Style%)+CHR$(Mask%)+Text$+CHR$(0)
IF EndFlag%=0 THEN ' wenn kein END-Flag, dann Continue-Byte
smAlert$=smAlert$+CHR$(1) ' setzen, ansonsten 0-Byte
ELSE
smAlert$=smAlert$+CHR$(0)
END IF
END SUB
'*** extra.library / SMTEXT() ***
'============================================================================
' Diese Routine erstellt einen Teilstring des Parameterstrings der Funktion
' »ShowMsg()«. Wahlweise kann der Text automatisch zentriert, oder links- bzw.
' rechtsbündig ausgerichtet werden.
'----------------------------------------------------------------------------
' Definiert: extra.bc (Copyright © 1998-2004 RhoSigma, Roland Heyder)
'
' Schablone: xPos%/A/N, yPos%/A/N, Text$/A, EndFlag%/K/S
'
' Parameter: xPos% --> x-Position des Textes,
' oder einer der oben definierten SMTPOS-Werte
'
' yPos% --> y-Position des Textes,
' Ausrichtung an der Oberkante des Fonts
'
' Text$ --> der Text selbst als Variable oder Konstante
'
' EndFlag% --> - TRUE& , dann endet hier der Parameterstring
' - FALSE&, dann MUSS noch ein weiterer Teilstring
' (SUB-Aufruf) folgen.
'
' Bemerkung: Nach Aufruf der Routine für alle einzelnen Teilstrings finden
' Sie den fertigen Parameterstring in der Variable »smAlert$«,
' welche Sie an »ShowMsg()« mittels »SADD(smAlert$)« übergeben
' müssen.
'
' Dieses Macro sollten Sie nur dann verwenden, wenn Sie für
' diesen Teilstring die gleichen Einstellungen wie für den vor-
' hergehenden Teilstring verwenden wollen. Wenn dieser Teil-
' string jedoch neue Einstellungen für Farben etc. erhalten
' soll, dann müssen Sie stattdessen das Macro »SMTEXTP()« ver-
' wenden.
'
' Ein Beispiel für die Benutzung dieser Routine finden Sie in
' der Datei »demo/ShowMsgDemo.BAS«.
'
' ACHTUNG: Sie dürfen in Ihrem Programm keine eigene Stringvariable mit
' ¯¯¯¯¯¯¯¯ dem Namen »smAlert$« verwenden, da diese unweigerlich durch
' dieses Unterprogramm überschrieben werden würde. Außerdem
' dürfen Sie auch nicht »smlFlag%« benutzen, da über dieses
' wichtige Daten zwischen den beiden Routinen »SMTEXTP()« und
' »SMTEXT()« ausgetauscht werden !!
'
' Außerdem müssen Sie den Parameterstring immer unmittelbar vor
' dem »ShowMsg()«-Aufruf definieren, da die Variable »smAlert$«
' jedesmal wieder überschrieben wird, und daher immer nur den
' zuletzt erstellten Parameterstring enthält.
'
' Siehe auch: »SMCOLOR()«, »SMTEXTP()«, »ShowMsg()«
'============================================================================
SUB SMTEXT(xPos%,yPos%,Text$,EndFlag%) STATIC
SHARED smAlert$,smlFlag%
IF smlFlag%<>0 THEN ' wird ein neuer ParamString angefangen,
smlFlag%=0 ' dann »smAlert$« erst zurücksetzen
smAlert$=""
ELSE
smlFlag%=EndFlag%
END IF
IF xPos%=SMTPOS_C% THEN ' gewünschte Ausrichtung,
xPos%=(640-(LEN(Text$)*8))/2 ' falls angegeben
ELSEIF xPos%=SMTPOS_L% THEN
xPos%=12
ELSEIF xPos%=SMTPOS_R% THEN
xPos%=(640-(LEN(Text$)*8))-12
END IF
smAlert$=smAlert$+MKI$(xPos%)+CHR$(yPos%)+CHR$(0)+Text$+CHR$(0)
IF EndFlag%=0 THEN ' wenn kein END-Flag, dann Continue-Byte
smAlert$=smAlert$+CHR$(1) ' setzen, ansonsten 0-Byte
ELSE
smAlert$=smAlert$+CHR$(0)
END IF
END SUB
'*** extra.library / GETSTRING$() ***
'============================================================================
' Diese Funktion liest einen MathString einer der ...ToString-Funktionen oder
' von »VSPrintF()« der extra.library ab Version 3.342 aus und weist ihn einem
' normalen BASIC-String zu.
'----------------------------------------------------------------------------
' Definiert: extra.bc (Copyright © 1998-2004 RhoSigma, Roland Heyder)
'
' Schablone: MathStrAddr&/A/N
'
' Parameter: MathStrAddr& --> die Adresse eines gültigen MathStrings, wie
' sie von den ...ToString-Funktionen sowie von
' »VSPrintF()« der extra.library ab v3.342
' zurückgegeben wird
'
' Bemerkung: Ein Beispiel für die Benutzung dieser Routine finden Sie in
' der Datei »demo/StringDemo.BAS«.
'============================================================================
FUNCTION GETSTRING$(MathStrAddr&) STATIC
STATIC strLen&,strTmp$,x%
strLen&=PEEKL(MathStrAddr&-4)
IF strLen&>0 THEN
strTmp$=""
FOR x%=0 TO strLen&-1
strTmp$=strTmp$+CHR$(PEEK(MathStrAddr&+x%))
NEXT x%
GETSTRING$=strTmp$
ELSE
GETSTRING$=""
END IF
END FUNCTION